package com.tapstitch.scm.common.enums;

import org.springframework.util.StringUtils;

import java.util.Arrays;
import java.util.List;


// 查看国家代号: https://baike.baidu.com/item/ISO%203166-1/5269555?fr=aladdin
// 货币 https://baike.baidu.com/item/ISO%204217/11018231?fromModule=search-result_lemma-recommend
// 国际长途电话区号表: https://baike.baidu.com/item/%E5%9B%BD%E9%99%85%E9%95%BF%E9%80%94%E7%94%B5%E8%AF%9D%E5%8C%BA%E5%8F%B7%E8%A1%A8/12803495?fr=ge_ala

public enum RegionEnum {

    AD( "安道尔", "Andorra", "AD", "AND", "020", "", "", "",0),
    AE( "阿联酋", "United Arab Emirates", "AE", "ARE", "784", "AED", "arabic", "971",0),
    AF( "阿富汗", "Afghanistan", "AF", "AFG", "004", "", "", "",0),
    AG( "安提瓜和巴布达", "Antigua and Barbuda", "AG", "ATG", "028", "", "", "",0),
    AI( "安圭拉", "Anguilla", "AI", "AIA", "660", "", "", "",0),
    AL( "阿尔巴尼亚", "Albania", "AL", "ALB", "008", "", "", "",0),
    AM( "亚美尼亚", "Armenia", "AM", "ARM", "051", "", "", "",0),
    AN( "荷属安的列斯", "Netherlands Antilles", "AN", "ANT", "530", "", "", "",0),
    AO( "安哥拉", "Angola", "AO", "AGO", "024", "", "", "",0),
    AQ( "南极洲", "Antarctica", "AQ", "ATA", "010", "", "", "",0),
    AR( "阿根廷", "Argentina", "AR", "ARG", "032", "ARS", "spanish", "54",0),
    AS( "美属萨摩亚", "American Samoa", "AS", "ASM", "016", "", "", "",0),
    AT( "奥地利", "Austria", "AT", "AUT", "040", "EUR", "english", "43",0),
    AU( "澳大利亚", "Australia", "AU", "AUS", "036", "AUD", "english", "61",0),
    AW( "阿鲁巴", "Aruba", "AW", "ABW", "533", "", "", "",0),
    AX( "奥兰群岛", "Aland Islands", "AX", "ALA", "248", "", "", "",0),
    AZ( "阿塞拜疆", "Azerbaijan", "AZ", "AZE", "031", "", "", "",0),
    BA( "波黑", "Bosnia and Herzegovina", "BA", "BIH", "070", "", "", "",0),
    BB( "巴巴多斯", "Barbados", "BB", "BRB", "052", "", "", "",0),
    BD( "孟加拉国", "Bangladesh", "BD", "BGD", "050", "BDT", "", "880",0),
    BE( "比利时", "Belgium", "BE", "BEL", "056", "EUR", "", "32",0),
    BF( "布基纳法索", "Burkina Faso", "BF", "BFA", "854", "", "", "",0),
    BG( "保加利亚", "Bulgaria", "BG", "BGR", "100", "BGN", "", "359",0),
    BH( "巴林", "Bahrain", "BH", "BHR", "048", "BHD", "arabic", "973",0),
    BI( "布隆迪", "Burundi", "BI", "BDI", "108", "", "", "",0),
    BJ( "贝宁", "Benin", "BJ", "BEN", "204", "XOF", "", "229",0),
    BM( "百慕大", "Bermuda", "BM", "BMU", "060", "", "", "",0),
    BN( "文莱", "Brunei Darussalam", "BN", "BRN", "096", "", "", "",0),
    BO( "玻利维亚", "Bolivia", "BO", "BOL", "068", "", "", "",0),
    BR( "巴西", "Brazil", "BR", "BRA", "076", "BRL", "portuguese", "55",0),
    BS( "巴哈马", "Bahamas", "BS", "BHS", "044", "", "", "",0),
    BT( "不丹", "Bhutan", "BT", "BTN", "064", "", "", "",0),
    BV( "布维岛", "Bouvet Island", "BV", "BVT", "074", "", "", "",0),
    BW( "博茨瓦纳", "Botswana", "BW", "BWA", "072", "", "", "",0),
    BY( "白俄罗斯", "Belarus", "BY", "BLR", "112", "", "", "",0),
    BZ( "伯利兹", "Belize", "BZ", "BLZ", "084", "", "", "",0),
    CA( "加拿大", "Canada", "CA", "CAN", "124", "CAD", "english", "1",0),
    CC( "科科斯（基林）群岛", "Cocos (Keeling) Islands", "CC", "CCK", "166", "", "", "",0),
    CD( "刚果（金）", "Congo (the Democratic Republic of the)", "CD", "COD", "180", "", "", "",0),
    CF( "中非", "Central African Republic", "CF", "CAF", "140", "", "", "",0),
    CG( "刚果（布）", "Congo", "CG", "COG", "178", "", "", "",0),
    CH( "瑞士", "Switzerland", "CH", "CHE", "756", "CHF", "", "41",0),
    CI( "科特迪瓦", "Côte d'Ivoire", "CI", "CIV", "384", "", "", "",0),
    CK( "库克群岛", "Cook Islands", "CK", "COK", "184", "", "", "",0),
    CL( "智利", "Chile", "CL", "CHL", "152", "CLP", "spanish", "56",0),
    CM( "喀麦隆", "Cameroon", "CM", "CMR", "120", "", "", "",0),
    CN( "中国", "China", "CN", "CHN", "156", "CNY", "chinese", "86",0),
    CO( "哥伦比亚", "Colombia", "CO", "COL", "170", "COP", "", "57",0),
    CR( "哥斯达黎加", "Costa Rica", "CR", "CRI", "188", "", "", "",0),
    CU( "古巴", "Cuba", "CU", "CUB", "192", "CUP", "", "53",0),
    CV( "佛得角", "Cape Verde", "CV", "CPV", "132", "", "", "",0),
    CX( "圣诞岛", "Christmas Island", "CX", "CXR", "162", "", "", "",0),
    CY( "塞浦路斯", "Cyprus", "CY", "CYP", "196", "", "", "",0),
    CZ( "捷克", "Czech Republic", "CZ", "CZE", "203", "CZK", "", "420",0),
    DE( "德国", "Germany", "DE", "DEU", "276", "EUR", "english", "49",0),
    DJ( "吉布提", "Djibouti", "DJ", "DJI", "262", "", "", "",0),
    DK( "丹麦", "Denmark", "DK", "DNK", "208", "DKK", "", "45",0),
    DM( "多米尼克", "Dominica", "DM", "DMA", "212", "", "", "",0),
    DO( "多米尼加", "Dominican Republic", "DO", "DOM", "214", "DOP", "", "1890",0),
    DZ( "阿尔及利亚", "Algeria", "DZ", "DZA", "012", "", "", "",0),
    EC( "厄瓜多尔", "Ecuador", "EC", "ECU", "218", "USD", "", "593",0),
    EE( "爱沙尼亚", "Estonia", "EE", "EST", "233", "", "", "",0),
    EG( "埃及", "Egypt", "EG", "EGY", "818", "EGP", "arabic", "20",0),
    EH( "西撒哈拉", "Western Sahara", "EH", "ESH", "732", "", "", "",0),
    ER( "厄立特里亚", "Eritrea", "ER", "ERI", "232", "ERN", "", "291",0),
    ES( "西班牙", "Spain", "ES", "ESP", "724", "EUR", "spanish", "34",0),
    ET( "埃塞俄比亚", "Ethiopia", "ET", "ETH", "231", "", "", "",0),
    FI( "芬兰", "Finland", "FI", "FIN", "246", "EUR", "", "358",0),
    FJ( "斐济", "Fiji", "FJ", "FJI", "242", "", "", "",0),
    FK( "福克兰群岛（马尔维纳斯）", "Falkland Islands [Malvinas]", "FK", "FLK", "238", "", "", "",0),
    FM( "密克罗尼西亚联邦", "Micronesia (the Federated States of)", "FM", "FSM", "583", "", "", "",0),
    FO( "法罗群岛", "Faroe Islands", "FO", "FRO", "234", "", "", "",0),
    FR( "法国", "France", "FR", "FRA", "250", "EUR", "arabic", "33",0),
    GA( "加蓬", "Gabon", "GA", "GAB", "266", "", "", "",0),
    GB( "英国", "United Kingdom", "GB", "GBR", "826", "GBP", "english", "44",0),
    GD( "格林纳达", "Grenada", "GD", "GRD", "308", "", "", "",0),
    GE( "格鲁吉亚", "Georgia", "GE", "GEO", "268", "", "", "",0),
    GF( "法属圭亚那", "French Guiana", "GF", "GUF", "254", "", "", "",0),
    GG( "格恩西岛", "Guernsey", "GG", "GGY", "831", "", "", "",0),
    GH( "加纳", "Ghana", "GH", "GHA", "288", "GHS", "", "233",0),
    GI( "直布罗陀", "Gibraltar", "GI", "GIB", "292", "", "", "",0),
    GL( "格陵兰", "Greenland", "GL", "GRL", "304", "", "", "",0),
    GM( "冈比亚", "Gambia", "GM", "GMB", "270", "", "", "",0),
    GN( "几内亚", "Guinea", "GN", "GIN", "324", "", "", "",0),
    GP( "瓜德罗普", "Guadeloupe", "GP", "GLP", "312", "", "", "",0),
    GQ( "赤道几内亚", "Equatorial Guinea", "GQ", "GNQ", "226", "", "", "",0),
    GR( "希腊", "Greece", "GR", "GRC", "300", "EUR", "", "30",0),
    GS( "南乔治亚岛和南桑德韦奇岛", "South Georgia and the South Sandwich Islands", "GS", "SGS", "239", "", "", "",0),
    GT( "危地马拉", "Guatemala", "GT", "GTM", "320", "", "", "",0),
    GU( "关岛", "Guam", "GU", "GUM", "316", "", "", "",0),
    GW( "几内亚比绍", "Guinea-Bissau", "GW", "GNB", "624", "", "", "",0),
    GY( "圭亚那", "Guyana", "GY", "GUY", "328", "", "", "",0),
    HK( "中国香港", "Hong Kong", "HK", "HKG", "344", "HKD", "chinese", "852",0),
    HM( "赫德岛和麦克唐纳岛", "Heard Island and McDonald Islands", "HM", "HMD", "334", "", "", "",0),
    HN( "洪都拉斯", "Honduras", "HN", "HND", "340", "", "", "",0),
    HR( "克罗地亚", "Croatia", "HR", "HRV", "191", "", "", "",0),
    HT( "海地", "Haiti", "HT", "HTI", "332", "", "", "",0),
    HU( "匈牙利", "Hungary", "HU", "HUN", "348", "HUF", "", "36",0),
    ID( "印度尼西亚", "Indonesia", "ID", "IDN", "360", "IDR", "", "62",0),
    IE( "爱尔兰", "Ireland", "IE", "IRL", "372", "EUR", "english", "353",0),
    IL( "以色列", "Israel", "IL", "ISR", "376", "ILS", "english", "972",0),
    IM( "英国属地曼岛", "Isle of Man", "IM", "IMN", "833", "", "", "",0),
    IN( "印度", "India", "IN", "IND", "356", "INR", "", "91",0),
    IO( "英属印度洋领地", "British Indian Ocean Territory", "IO", "IOT", "086", "", "", "",0),
    IQ( "伊拉克", "Iraq", "IQ", "IRQ", "368", "USD", "arabic", "964",0),
    IR( "伊朗", "Iran", "IR", "IRN", "364", "IRR", "", "98",0),
    IS( "冰岛", "Iceland", "IS", "ISL", "352", "", "", "",0),
    IT( "意大利", "Italy", "IT", "ITA", "380", "EUR", "english", "39",0),
    JE( "泽西岛", "Jersey", "JE", "JEY", "832", "", "", "",0),
    JM( "牙买加", "Jamaica", "JM", "JAM", "388", "", "", "",0),
    JO( "约旦", "Jordan", "JO", "JOR", "400", "JOD", "arabic", "962",0),
    JP( "日本", "Japan", "JP", "JPN", "392", "JPY", "english", "48",0),
    KE( "肯尼亚", "Kenya", "KE", "KEN", "404", "KES", "", "254",0),
    KG( "吉尔吉斯斯坦", "Kyrgyzstan", "KG", "KGZ", "417", "", "", "",0),
    KH( "柬埔寨", "Cambodia", "KH", "KHM", "116", "", "", "",0),
    KI( "基里巴斯", "Kiribati", "KI", "KIR", "296", "", "", "",0),
    KM( "科摩罗", "Comoros", "KM", "COM", "174", "", "", "",0),
    KN( "圣基茨和尼维斯", "Saint Kitts and Nevis", "KN", "KNA", "659", "", "", "",0),
    KP( "朝鲜", "Democratic People's Republc of Korea", "KP", "PRK", "408", "", "", "",0),
    KR( "韩国", "Republic of Korea", "KR", "KOR", "410", "KRW", "english", "48",0),
    KW( "科威特", "Kuwait", "KW", "KWT", "414", "KWD", "arabic", "965",0),
    KY( "开曼群岛", "Cayman Islands", "KY", "CYM", "136", "", "", "",0),
    KZ( "哈萨克斯坦", "Kazakhstan", "KZ", "KAZ", "398", "", "", "73",0),
    LA( "老挝", "Laos", "LA", "LAO", "418", "", "", "",0),
    LB( "黎巴嫩", "Lebanon", "LB", "LBN", "422", "USD", "arabic", "961",0),
    LC( "圣卢西亚", "Saint Lucia", "LC", "LCA", "662", "", "", "",0),
    LI( "列支敦士登", "Liechtenstein", "LI", "LIE", "438", "", "", "",0),
    LK( "斯里兰卡", "Sri Lanka", "LK", "LKA", "144", "LKR", "english", "94",0),
    LR( "利比里亚", "Liberia", "LR", "LBR", "430", "", "", "",0),
    LS( "莱索托", "Lesotho", "LS", "LSO", "426", "", "", "",0),
    LT( "立陶宛", "Lithuania", "LT", "LTU", "440", "", "", "",0),
    LU( "卢森堡", "Luxembourg", "LU", "LUX", "442", "", "", "352",0),
    LV( "拉脱维亚", "Latvia", "LV", "LVA", "428", "", "", "",0),
    LY( "利比亚", "Libya", "LY", "LBY", "434", "LYD", "", "218",0),
    MA( "摩洛哥", "Morocco", "MA", "MAR", "504", "MAD", "arabic", "212",0),
    MC( "摩纳哥", "Monaco", "MC", "MCO", "492", "", "", "",0),
    MD( "摩尔多瓦", "Moldova (the Republic of)", "MD", "MDA", "498", "", "", "",0),
    ME( "黑山", "Montenegro", "ME", "MNE", "499", "", "", "",0),
    MG( "马达加斯加", "Madagascar", "MG", "MDG", "450", "", "", "",0),
    MH( "马绍尔群岛", "Marshall Islands", "MH", "MHL", "584", "", "", "",0),
    MK( "前南马其顿", "Macedonia (the former Yugoslav Republic of)", "MK", "MKD", "807", "", "", "",0),
    ML( "马里", "Mali", "ML", "MLI", "466", "", "", "",0),
    MM( "缅甸", "Myanmar", "MM", "MMR", "104", "", "", "",0),
    MN( "蒙古", "Mongolia", "MN", "MNG", "496", "", "", "",0),
    MO( "中国澳门", "Macao", "MO", "MAC", "446", "", "", "",0),
    MP( "北马里亚纳", "Northern Mariana Islands", "MP", "MNP", "580", "", "", "",0),
    MQ( "马提尼克", "Martinique", "MQ", "MTQ", "474", "", "", "",0),
    MR( "毛利塔尼亚", "Mauritania", "MR", "MRT", "478", "", "", "",0),
    MS( "蒙特塞拉特", "Montserrat", "MS", "MSR", "500", "", "", "",0),
    MT( "马耳他", "Malta", "MT", "MLT", "470", "", "", "",0),
    MU( "毛里求斯", "Mauritius", "MU", "MUS", "480", "MUR", "", "230",0),
    MV( "马尔代夫", "Maldives", "MV", "MDV", "462", "", "", "",0),
    MW( "马拉维", "Malawi", "MW", "MWI", "454", "", "", "",0),
    MX( "墨西哥", "Mexico", "MX", "MEX", "484", "MXN", "spanish", "52",0),
    MY( "马来西亚", "Malaysia", "MY", "MYS", "458", "MYR", "english", "60",0),
    MZ( "莫桑比克", "Mozambique", "MZ", "MOZ", "508", "", "", "",0),
    NA( "纳米比亚", "Namibia", "NA", "NAM", "516", "", "", "",0),
    NC( "新喀里多尼亚", "New Caledonia", "NC", "NCL", "540", "", "", "",0),
    NE( "尼日尔", "Niger", "NE", "NER", "562", "", "", "",0),
    NF( "诺福克岛", "Norfolk Island", "NF", "NFK", "574", "", "", "",0),
    NG( "尼日利亚", "Nigeria", "NG", "NGA", "566", "NGN", "", "234",0),
    NI( "尼加拉瓜", "Nicaragua", "NI", "NIC", "558", "", "", "",0),
    NL( "荷兰", "Netherlands", "NL", "NLD", "528", "EUR", "", "31",0),
    NO( "挪威", "Norway", "NO", "NOR", "578", "", "", "47",0),
    NP( "尼泊尔", "Nepal", "NP", "NPL", "524", "", "", "",0),
    NR( "瑙鲁", "Nauru", "NR", "NRU", "520", "", "", "",0),
    NU( "纽埃", "Niue", "NU", "NIU", "570", "", "", "",0),
    NZ( "新西兰", "New Zealand", "NZ", "NZL", "554", "NZD", "english", "64",0),
    OM( "阿曼", "Oman", "OM", "OMN", "512", "OMR", "arabic", "968",0),
    PA( "巴拿马", "Panama", "PA", "PAN", "591", "", "", "",0),
    PE( "秘鲁", "Peru", "PE", "PER", "604", "PEN", "spanish", "51",0),
    PF( "法属波利尼西亚", "French Polynesia", "PF", "PYF", "258", "", "", "",0),
    PG( "巴布亚新几内亚", "Papua New Guinea", "PG", "PNG", "598", "", "", "",0),
    PH( "菲律宾", "Philippines", "PH", "PHL", "608", "PHP", "", "63",0),
    PK( "巴基斯坦", "Pakistan", "PK", "PAK", "586", "", "", "",0),
    PL( "波兰", "Poland", "PL", "POL", "616", "PLN", "english", "48",0),
    PM( "圣皮埃尔和密克隆", "Saint Pierre and Miquelon", "PM", "SPM", "666", "", "", "",0),
    PN( "皮特凯恩", "Pitcairn", "PN", "PCN", "612", "", "", "",0),
    PR( "波多黎各", "Puerto Rico", "PR", "PRI", "630", "", "", "",0),
    PS( "巴勒斯坦", "Palestinian Territory (the Occupied)", "PS", "PSE", "275", "", "", "",0),
    PT( "葡萄牙", "Portugal", "PT", "PRT", "620", "EUR", "portuguese", "351",0),
    PW( "帕劳", "Palau", "PW", "PLW", "585", "", "", "",0),
    PY( "巴拉圭", "Paraguay", "PY", "PRY", "600", "", "", "",0),
    QA( "卡塔尔", "Qatar", "QA", "QAT", "634", "QAR", "arabic", "974",0),
    RE( "留尼汪", "Réunion", "RE", "REU", "638", "", "", "",0),
    RO( "罗马尼亚", "Romania", "RO", "ROU", "642", "RON", "", "40",0),
    RS( "塞尔维亚", "Serbia", "RS", "SRB", "688", "", "", "",0),
    RU( "俄罗斯", "Russia", "RU", "RUS", "643", "", "", "7",0),
    RW( "卢旺达", "Rwanda", "RW", "RWA", "646", "", "", "",0),
    SA( "沙特阿拉伯", "Saudi Arabia", "SA", "SAU", "682", "SAR", "arabic", "966",0),
    SB( "所罗门群岛", "Solomon Islands", "SB", "SLB", "090", "", "", "",0),
    SC( "塞舌尔", "Seychelles", "SC", "SYC", "690", "", "", "",0),
    SD( "苏丹", "Sudan", "SD", "SDN", "736", "", "", "",0),
    SE( "瑞典", "Sweden", "SE", "SWE", "752", "SEK", "", "46",0),
    SG( "新加坡", "Singapore", "SG", "SGP", "702", "SGD", "english", "65",0),
    SH( "圣赫勒拿", "Saint Helena", "SH", "SHN", "654", "", "", "",0),
    SI( "斯洛文尼亚", "Slovenia", "SI", "SVN", "705", "", "", "",0),
    SJ( "斯瓦尔巴岛和扬马延岛", "Svalbard and Jan Mayen", "SJ", "SJM", "744", "", "", "",0),
    SK( "斯洛伐克", "Slovak", "SK", "SVK", "703", "", "", "",0),
    SL( "塞拉利昂", "Sierra Leone", "SL", "SLE", "694", "", "", "",0),
    SM( "圣马力诺", "San Marino", "SM", "SMR", "674", "", "", "",0),
    SN( "塞内加尔", "Senegal", "SN", "SEN", "686", "", "", "",0),
    SO( "索马里", "Somalia", "SO", "SOM", "706", "", "", "",0),
    SR( "苏里南", "Suriname", "SR", "SUR", "740", "", "", "",0),
    ST( "圣多美和普林西比", "Sao Tome and Principe", "ST", "STP", "678", "", "", "",0),
    SV( "萨尔瓦多", "El Salvador", "SV", "SLV", "222", "", "", "",0),
    SY( "叙利亚", "Syrian Arab Republic", "SY", "SYR", "760", "SYP", "", "963",0),
    SZ( "斯威士兰", "Swaziland", "SZ", "SWZ", "748", "SZL", "", "268",0),
    TC( "特克斯和凯科斯群岛", "Turks and Caicos Islands", "TC", "TCA", "796", "", "", "",0),
    TD( "乍得", "Chad", "TD", "TCD", "148", "", "", "",0),
    TF( "法属南部领地", "French Southern Territories", "TF", "ATF", "260", "", "", "",0),
    TG( "多哥", "Togo", "TG", "TGO", "768", "", "", "",0),
    TH( "泰国", "Thailand", "TH", "THA", "764", "THB", "", "66",0),
    TJ( "塔吉克斯坦", "Tajikistan", "TJ", "TJK", "762", "", "", "",0),
    TK( "托克劳", "Tokelau", "TK", "TKL", "772", "", "", "",0),
    TL( "东帝汶", "Timor-Leste", "TL", "TLS", "626", "", "", "",0),
    TM( "土库曼斯坦", "Turkmenistan", "TM", "TKM", "795", "", "", "",0),
    TN( "突尼斯", "Tunisia", "TN", "TUN", "788", "", "", "",0),
    TO( "汤加", "Tonga", "TO", "TON", "776", "", "", "",0),
    TR( "土耳其", "Turkey", "TR", "TUR", "792", "TRY", "english", "90",0),
    TT( "特立尼达和多巴哥", "Trinidad and Tobago", "TT", "TTO", "780", "", "", "",0),
    TV( "图瓦卢", "Tuvalu", "TV", "TUV", "798", "", "", "",0),
    TW( "中国台湾", "Taiwan", "TW", "TWN", "158", "TWD", "chinese", "886",0),
    TZ( "坦桑尼亚", "Tanzania,United Republic of", "TZ", "TZA", "834", "", "", "",0),
    UA( "乌克兰", "Ukraine", "UA", "UKR", "804", "", "", "380",0),
    UG( "乌干达", "Uganda", "UG", "UGA", "800", "", "", "",0),
    UM( "美国本土外小岛屿", "United States Minor Outlying Islands", "UM", "UMI", "581", "", "", "",0),
    US( "美国", "United States", "US", "USA", "840", "USD", "english", "1",0),
    UY( "乌拉圭", "Uruguay", "UY", "URY", "858", "", "", "",0),
    UZ( "乌兹别克斯坦", "Uzbekistan", "UZ", "UZB", "860", "", "", "",0),
    VA( "梵蒂冈", "Holy See [Vatican City State]", "VA", "VAT", "336", "", "", "",0),
    VC( "圣文森特和格林纳丁斯", "Saint Vincent and the Grenadines", "VC", "VCT", "670", "", "", "",0),
    VE( "委内瑞拉", "Venezuela", "VE", "VEN", "862", "", "", "",0),
    VG( "英属维尔京群岛", "Virgin Islands (British)", "VG", "VGB", "092", "", "", "",0),
    VI( "美属维尔京群岛", "Virgin Islands (U.S.)", "VI", "VIR", "850", "", "", "",0),
    VN( "越南", "Viet Nam", "VN", "VNM", "704", "VND", "", "84",0),
    VU( "瓦努阿图", "Vanuatu", "VU", "VUT", "548", "", "", "",0),
    WF( "瓦利斯和富图纳", "Wallis and Futuna", "WF", "WLF", "876", "", "", "",0),
    WS( "萨摩亚", "Samoa", "WS", "WSM", "882", "", "", "",0),
    YE( "也门", "Yemen", "YE", "YEM", "887", "", "", "",0),
    YT( "马约特", "Mayotte", "YT", "MYT", "175", "", "", "",0),
    YU( "南斯拉夫", "Yugoslavia", "YU", "YUG", "891", "", "", "",0),
    ZA( "南非", "South Africa", "ZA", "ZAF", "710", "ZAR", "", "27",0),
    ZM( "赞比亚", "Zambia", "ZM", "ZMB", "894", "ZMW", "", "260",0),
    ZW( "津巴布韦", "Zimbabwe", "ZW", "ZWE", "716", "ZWL", "", "263",0),
    RM( "北马其顿", "North Macedonia", "RM", "RM", "716", "ZWL", "", "263",0),


    ;

    /** 国家区域名称(中文) */
    private String countryNameCn;
    /** 国家区域名称(英文) */
    private String countryNameEn;
    /** 国家2字母代码 */
    private String countryCode2;
    /** 国家3字母代码 */
    private String countryCode3;
    /** 国家数字代码 */
    private String countryCodeNumber;
    /** 币种 */
    private String currency;
    /** 语言 */
    private String language;
    /** 国家区号 */
    private String countryCallingCode;
    /**电话长度*/
    private int telSize;

    RegionEnum(String countryNameCn, String countryNameEn, String countryCode2, String countryCode3, String countryCodeNumber, String currency, String language, String countryCallingCode, int telSize) {
        this.countryNameCn = countryNameCn;
        this.countryNameEn = countryNameEn;
        this.countryCode2 = countryCode2;
        this.countryCode3 = countryCode3;
        this.countryCodeNumber = countryCodeNumber;
        this.currency = currency;
        this.language = language;
        this.countryCallingCode = countryCallingCode;
        this.telSize = telSize;
    }

    /***根据国家和电话返回带国家区号的手机号码*/
    public static String getFullTelNumber(String regionName, String telNumber) {
        if (!StringUtils.hasText(regionName) || !StringUtils.hasText(telNumber)) {
            return null;
        }
        telNumber = StringUtils.trimAllWhitespace(telNumber).replaceAll("[\\s+\\p{C}\\s+]", "");
        RegionEnum regionEnum = get(regionName);
        if (null != regionEnum && regionEnum.getTelSize() == telNumber.length()) {
            return regionEnum.getCountryCallingCode() + telNumber;
        }
        if (null != regionEnum && (regionEnum.getTelSize() + 1) == telNumber.length() && telNumber.startsWith("0")) {
            return regionEnum.getCountryCallingCode() + telNumber.substring(1);
        }
        return telNumber.replaceFirst("^0*", "");
    }

    public static RegionEnum get(String regionName) {
        for (RegionEnum regionEnum : values()) {
            if (regionEnum.getCountryNameEn().equals(regionName)) {
                return regionEnum;
            }
        }
        return null;
    }

    public String getCountryNameCn() {
        return countryNameCn;
    }

    public String getCountryNameEn() {
        return countryNameEn;
    }

    public String getCountryCode2() {
        return countryCode2;
    }

    public String getCountryCode3() {
        return countryCode3;
    }

    public String getCountryCodeNumber() {
        return countryCodeNumber;
    }

    public String getCurrency() {
        return currency;
    }

    public String getLanguage() {
        return language;
    }

    public String getCountryCallingCode() {
        return countryCallingCode;
    }

    public int getTelSize() {
        return telSize;
    }


    public static RegionEnum getByCode2(String code){
        if(!StringUtils.hasText(code)){
            return null;
        }

        for (RegionEnum e : values()) {
            if (e.getCountryCode2().equals(code)) {
                return e;
            }
        }
        return null;
    }


    public static RegionEnum getByCode3(String code3){
        if(!StringUtils.hasText(code3)){
            return null;
        }

        for (RegionEnum e : values()) {
            if (e.getCountryCode3().equals(code3)) {
                return e;
            }
        }
        return null;
    }

    public static RegionEnum getByName(String name){
//        if(!StringUtils.hasText(name)){
//            return null;
//        }
//
//        for (RegionEnum e : values()) {
//            if (e.getCountryNameEn().equals(name)) {
//                return e;
//            }
//        }
//        return null;

        return getByNameIgnoreCase(name);
    }



    public static RegionEnum getByNameIgnoreCase(String name){
        if(!StringUtils.hasText(name)){
            return null;
        }

        for (RegionEnum e : values()) {
            if (e.getCountryNameEn().equalsIgnoreCase(name)) {
                return e;
            }
        }

        boolean hongKong = isHongKong(name);
        if(hongKong){
            return RegionEnum.HK;
        }

        boolean isMacao = isMacao(name);
        if(isMacao){
            return RegionEnum.MO;
        }

        boolean isTaiwan = isTaiwan(name);
        if(isTaiwan){
            return RegionEnum.TW;
        }

        boolean isBaXi = isBaXi(name);
        if(isBaXi){
            return RegionEnum.BR;
        }

        boolean isKR = isKR(name);
        if(isKR){
            return RegionEnum.KR;
        }

        boolean isSK = isSK(name);
        if(isSK){
            return RegionEnum.SK;
        }

        return null;
    }

    public static boolean isHongKong(String countryName){
        if(StringUtils.isEmpty(countryName)){
            return false;
        }

        countryName = countryName.toUpperCase();
        if(countryName.contains("HongKong, China".toUpperCase()) || countryName.contains("HongKong".toUpperCase())
                || countryName.contains("Hong Kong".toUpperCase()) ||  countryName.equals("HK") || countryName.equals("HKG")){
            return true;
        }

        return false;
    }

    public static boolean isBaXi(String countryName){
        if(StringUtils.isEmpty(countryName)){
            return false;
        }

        countryName = countryName.toUpperCase();
        if(countryName.equals("Brasil".toUpperCase()) || countryName.equals("Brazil".toUpperCase()) ){

            return true;
        }

        return false;
    }

    /**
     * 澳门
     * @param countryName
     * @return
     */
    public static boolean isMacao(String countryName){
        if(StringUtils.isEmpty(countryName)){
            return false;
        }

        countryName = countryName.toUpperCase();
        if(countryName.contains("Macao, China".toUpperCase()) || countryName.contains("Macao".toUpperCase()) ){
            return true;
        }

        return false;
    }

    /**
     * 台湾
     * @param countryName
     * @return
     */
    public static boolean isTaiwan(String countryName){
        if(StringUtils.isEmpty(countryName)){
            return false;
        }

        countryName = countryName.toUpperCase();
        if(countryName.contains("Taiwan, China".toUpperCase()) || countryName.contains("Taiwan".toUpperCase())
                || countryName.contains("Tai Wan".toUpperCase()) ){
            return true;
        }

        return false;
    }

    /**
     * 是韩国思密达 ？
     * @param countryName
     * @return
     */
    public static boolean isKR(String countryName){
        if(StringUtils.isEmpty(countryName)){
            return false;
        }

        if( "South Korea".equals(countryName) || KR.getCountryNameEn().equals(countryName) ){
            return true;
        }

        return false;
    }

    /**
     * 是斯洛伐克 ？
     * @param countryName
     * @return
     */
    public static boolean isSK(String countryName){
        if(StringUtils.isEmpty(countryName)){
            return false;
        }

        if( "Slovakia".equals(countryName) || SK.getCountryNameEn().equals(countryName) ){
            return true;
        }

        return false;
    }

    public static RegionEnum getByValue(String value){

        if(StringUtils.isEmpty(value)){
            return null;
        }

        if(getByNameIgnoreCase(value) != null){
            return getByNameIgnoreCase(value);
        }

        String valueUpperCase = value.toUpperCase();
        if(getByCode2(valueUpperCase) != null){
            return getByCode2(valueUpperCase);
        }

        if(getByCode3(valueUpperCase) != null){
            return getByCode3(valueUpperCase);
        }

        boolean hongKong = isHongKong(value);
        if(hongKong){
            return RegionEnum.HK;
        }

        boolean isMacao = isMacao(value);
        if(isMacao){
            return RegionEnum.MO;
        }

        boolean isTaiwan = isTaiwan(value);
        if(isTaiwan){
            return RegionEnum.TW;
        }

        boolean isBaXi = isBaXi(value);
        if(isBaXi){
            return RegionEnum.BR;
        }

        return null;
    }


    /**
     * 获取欧洲国家
     * @return
     */
    public static List<RegionEnum> getEuroRegionEnumList(){
        return Arrays.asList(AT,BE,BG,CH,CZ,DE,DK,EE,ES,FI,FR,GB,GR,HR,HU,IE,IT,IS,LT,LV,MC,MD,MT,NL,NO,PL,PT,RO,RU,SE,SK,SM,UA,VA,YU);
    }

    /**
     * 东南亚国家集合
     * @return
     */
    public static List<RegionEnum> listSoutheastAsiaRegions(){
       return Arrays.asList(RegionEnum.ID, RegionEnum.MY, RegionEnum.VN, RegionEnum.PH, RegionEnum.TH, RegionEnum.SG, RegionEnum.KH, RegionEnum.LA, RegionEnum.MM, RegionEnum.BN, RegionEnum.TL);
    }

    /**
     * 是中国吗?
     * @param nameOrCode
     * @return
     */
    public static boolean isChina(String nameOrCode){
        return RegionEnum.CN.getCountryNameEn().equalsIgnoreCase(nameOrCode) || RegionEnum.CN.getCountryCode2().equalsIgnoreCase(nameOrCode) ;
    }

    public static void main(String[] args) {
//        String name = "Hong Kong";
//        boolean hongKong = isHongKong(name);
//        System.out.println(hongKong);


        List<RegionEnum> euroRegionEnumList = getEuroRegionEnumList();
        for (RegionEnum e : euroRegionEnumList){
            System.out.println(e.getCountryNameCn());
        }

    }

}
